Ruby 드라이버

CUBRID Ruby 드라이버는 Ruby로 작성한 응용 프로그램에서 CUBRID 데이터베이스를 사용할 수 있게 하는 드라이버로, RubyGem 패키지 형태로 제공된다.

CUBRID Ruby 드라이버는 CCI API를 기반으로 작성되었으므로, CCI API 및 CCI에 적용되는 CCI_DEFAULT_AUTOCOMMIT 과 같은 설정 파라미터에 영향을 받는다.

별도로 Ruby 드라이버를 다운로드하거나 Ruby 드라이버에 대한 최신 정보를 확인하려면 http://www.cubrid.org/wiki_apis/entry/cubrid-ruby-driver에 접속한다.

Ruby 설치 및 설정

기본 환경

  • Ruby 1.8.7 이상
  • CUBRID gem
  • ActiveRecord gem

Linux

gem 을 사용하여 CUBRID Connector를 설치할 수 있다. 다음과 같이 sudo 명령어에 -E 옵션을 사용하여 sudo 명령어가 CUBRID 데이터베이스 설치 경로 환경 변수를 변경하지 않도록 해야 한다.

sudo -E gem install cubrid

Windows

다음 명령어를 실행하여 최신 버전의 CUBRID Ruby 드라이버를 설치한다.

gem install cubrid

Note

Gem Installer가 설치되어 있지 않다면 http://www.cubrid.org/wiki_apis/entry/cubrid-ruby-driver-installation-instructions 를 참고한다.

Ruby 예제 프로그램

여기에서는 Ruby로 CUBRID 데이터베이스에 대한 작업을 수행하는 예제 프로그램을 작성한다. 예제로 다음과 같이 테이블을 생성한다.

CREATE TABLE "countries"(
    "id" integer AUTO_INCREMENT,
    "code" character varying(3) NOT NULL UNIQUE,
    "name" character varying(40) NOT NULL UNIQUE,
    "record_date" datetime DEFAULT sysdatetime NOT NULL,
    CONSTRAINT pk_countries_id PRIMARY KEY("id")
);

CREATE TABLE "cities"(
    "id" integer AUTO_INCREMENT NOT NULL UNIQUE,
    "name" character varying(40) NOT NULL,
    "country_id" integer NOT NULL,
    "record_date" datetime DEFAULT sysdatetime NOT NULL,
    FOREIGN KEY ("country_id") REFERENCES "countries"("id") ON DELETE RESTRICT ON UPDATE RESTRICT,
    CONSTRAINT pk_cities_id PRIMARY KEY("id")
);

라이브러리 로드

예제 프로그램으로 tutorial.rb 라는 파일을 생성하고 다음과 같은 기본 설정을 작성한다.

require 'rubygems'
require 'active_record'
require 'pp'

데이터베이스 연결

다음과 같이 파라미터를 정의하여 데이터베이스 연결을 생성한다.

ActiveRecord::Base.establish_connection(
 :adapter => "cubrid",
 :host => "localhost",
 :database => "demodb" ,
 :user => "dba"
)

데이터베이스에 객체 삽입

테이블을 조작하기 전에 테이블을 ActiveRecord의 클래스와 매핑해야 한다.

class Country < ActiveRecord::Base
end

class City < ActiveRecord::Base
end

Country.create(:code => 'ROU', :name => 'Romania')
Country.create(:code => 'HUN', :name => 'Hungary')
Country.create(:code => 'DEU', :name => 'Germany')
Country.create(:code => 'FRA', :name => 'France')
Country.create(:code => 'ITA', :name => 'Italy', :record_date => Time.now)
Country.create(:code => 'SPN', :name => 'Spain')

데이터베이스에서 레코드 조회

다음과 같이 데이터베이스에서 레코드를 조회한다.

romania = Country.find(1)
pp(romania)

romania = Country.where(:code => 'ROU')
pp(romania)

Country.find_each do |country|
 pp(country)
end

데이터베이스 레코드 갱신

여기에서는 다음과 같이 Spaincode'SPN' 에서 'ESP' 로 변경한다.

Country.transaction do
 spain = Country.where(:code => 'SPN')[0]
 spain.code = 'ESP'
 spain.save
end

데이터베이스 레코드 삭제

데이터베이스의 레코드를 삭제하는 코드는 다음과 같다.

Country.transaction do
 spain = Country.where(:code => 'ESP')[0]
 spain.destroy
end

연관(association)을 이용한 작업

국가에 도시를 추가하는 방법 중 하나는 Country 를 조회하여 Countrycode 를 새로운 City 객체에 할당하는 것이다.

romania = Country.where(:code => 'ROU')[0]
City.create(:country_id => romania.id, :name => 'Bucharest');

더 좋은 방법은 다음과 같이 ActiveRecord에 관계를 알리고 이를 Country 클래스에 선언하는 것이다.

class Country < ActiveRecord::Base
 has_many :cities, :dependent => :destroy
end

class City < ActiveRecord::Base
end

위 코드에 따라 한 국가는 여러 개의 도시를 가질 수 있다. 이제 다음과 같이 간단하게 국가에 새 도시를 추가할 수 있다. 이 방법을 사용하면 도시에 접근할 때 참조되는 국가의 모든 도시들을 얻을 수 있으므로 유용하게 사용할 수 있다.

italy = Country.where(:code => 'ITA')[0]
italy.cities.create(:name => 'Milano');
italy.cities.create(:name => 'Napoli');

pp (romania.cities)
pp (italy.cities)

또한 다음과 같은 코드로 국가를 삭제하면 그 국가의 모든 도시가 삭제된다.

romania.destroy

ActiveRecord 는 일대일이나 다대다(many-to-many)와 같은 관계도 지원한다.

메타데이터 관리

ActiveRecord를 사용하면 코드를 수정하지 않아도 다른 데이터베이스를 사용할 수 있다.

데이터베이스 구조 정의

ActiveRecord::Schema.define 을 사용하여 새 테이블을 정의할 수 있다. 예를 들면 다음과 같이 일대다(one-to-many)로 대응되는 책에 대한 테이블(books)과 저자에 대한 테이블(authors)을 생성할 수 있다.

ActiveRecord::Schema.define do
 create_table :books do |table|
  table.column :title, :string, :null => false
  table.column :price, :float, :null => false
  table.column :author_id, :integer, :null => false
 end

 create_table :authors do |table|
  table.column :name, :string, :null => false
  table.column :address, :string
  table.column :phone, :string
 end

 add_index :books, :author_id
end

CUBRID에서 지원하는 칼럼 타입은 :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :boolean, :bit, :monetary, :smallint, :bigint, :char 이다. 현재 :binary 는 지원하지 않는다.

테이블 칼럼 관리

ActiveRecord::Migration 의 기능을 사용하여 테이블의 칼럼을 추가하거나 업데이트, 삭제할 수 있다.

ActiveRecord::Schema.define do
 create_table :todos do |table|
  table.column :title, :string
  table.column :description, :string
 end

 change_column :todos, :description, :string, :null => false
 add_column :todos, :created, :datetime, :default => Time.now
 rename_column :todos, :created, :record_date
 remove_column :todos, :record_date

end

데이터베이스 스키마 덤프

ActiveRecord::SchemaDumper.dump 를 사용하여 현재 사용 중인 스키마의 정보를 덤프할 수 있다. 덤프된 스키마 정보는 플랫폼과 상관없이 사용할 수 있는 형식으로 저장되며 Ruby ActiveRecord에서도 사용할 수 있다. 단, :bigint, :bit, :monetary 등과 같이 특정 데이터베이스에서 사용되는 커스텀 칼럼 타입을 사용한다면 제대로 동작하지 않을 수 있다.

서버 용량 정보 획득

현재 연결에서 다음과 같이 데이터베이스 정보를 획득할 수 있다.

puts "Maximum column length        : " + ActiveRecord::Base.connection.column_name_length.to_s
puts "SQL statement maximum length : " + ActiveRecord::Base.connection.sql_query_length.to_s
puts "Quoting : '''test'''         : " + ActiveRecord::Base.connection.quote("'''test'''")

데이터베이스 생성

CUBRID에서는 데이터베이스 생성을 cubrid create 유틸리티 명령어로만 처리하기 때문에, 프로그램 내에서는 데이터베이스를 생성할 수 없다.

ActiveRecord::Schema.define do
 create_database('not_supported')
end